package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.annotation.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;
    @Autowired(required = false)//类似于懒加载
    private Jedis jedis;

    @Override
    @CacheFind(key = "ITEM_CAT")//一般添加业务名称
    public ItemCat findParentName(Long itemCatId) {
        return itemCatMapper.selectById(itemCatId);
    }
    /**
     * 根据parentId查询子集目录信息
     * 获取itemcatList集合,将List集合转化为VOList
     */
    @Override
    @CacheFind(key = "ITEM_CAT_PARENT",seconds = 60*60*24*7)//这是自定义的注解,AOP实现缓存  要求:具体的key自动补齐
    public List<EasyUITree> findItemCatList(Long parentId) {
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        List<EasyUITree> treeList = new ArrayList<>(catList.size());
        for (ItemCat c :catList) {
            EasyUITree easyUITree = new EasyUITree();
            easyUITree.setId(c.getId());
            easyUITree.setText(c.getName());
            String state = c.getIsParent()?"closed":"open";//如果是父级,默认应该关闭(closed)
                            // getIsParent:是Boolean类型,在MySQL使用tinyint存储
            easyUITree.setState(state);
            treeList.add(easyUITree);
        }
        return treeList;
    }
    /**
     * 不使用AOP实现缓存
     * 实现的步骤:
     *  1.定义key     ITEM_CAT_PARENT::0  ::在工作中常用来表示集合
     *  2.先查询缓存
     *      有   true    获取缓存数据之后,将json转化为具体的对象,之后返回
     *      无   false   应该查询数据库,并且将数据保存入redis缓存,默认7天超时
     * @param parentId 查询条件
     * @return List<EasyUITree>
     */
    @Override
    public List<EasyUITree> findItemCatCache(Long parentId) {
        List treeList = new ArrayList<>();
        //1.定义key
        String key ="ITEM_CAT_PARENT::"+parentId;
        //2.从缓存中获取对象
        long t1 = System.currentTimeMillis();
        if (jedis.exists(key)){
            //存在  直接获取缓存  转化为对象
            String json = jedis.get(key);
            treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
            long t2 = System.currentTimeMillis();
            System.out.println("查询redis缓存获取数据,耗时"+(t2-t1));
        }else {
            //不存在  应该先查询数据库  将数据保存到缓存中
            treeList = findItemCatList(parentId);
            String json = ObjectMapperUtil.toJson(treeList);
            jedis.setex(key, 60*60*24*7, json);
            long t2 = System.currentTimeMillis();
            System.out.println("查询数据库获取结果,耗时"+(t2-t1));
        }
        return treeList;
    }
}
